﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once

#include "IGraphicsNode.h"
#include "Intervald.h"

namespace gcmp
{
    class IGraphicsBRepEdge;
    class IGraphicsPlane;
    class IGraphicsBRepBody;
    class IFace;

    /// \brief BRep体的面图形节点
    ///
    /// 表示体的一个面，不能脱离体存在
    class GCMP_GRAPHICS_NODE_INTERFACE_EXPORT IGraphicsBRepFace : public IGraphicsNode
    {
        DEFINE_CAST_DERIVED(IGraphicsBRepFace, IGraphicsNode)
  
    public:
        /// \brief 析构器
        virtual ~IGraphicsBRepFace();

    public:

        /// \brief 获取是否是平面
        /// \return true-是；false-否
        virtual bool IsPlanar() const = 0;

        /// \brief 获取是否是圆柱面
        /// \return true-是；false-否
        virtual bool IsCylindric() const = 0;

        /// \brief 获取UV点的法向
        /// \param uv UV点的坐标，默认值为(0,0)
        /// \return UV点的法向
        virtual Vector3d GetNormal(const Vector2d & uv=Vector2d()) const = 0;

        /// \brief 获取面对应的平面图形节点
        /// \return 面对应的平面图形节点
        virtual OwnerPtr<IGraphicsPlane> GetGeometryPlane() const = 0;

        /// \brief 获取面的所有边图形节点集合
        /// \return 面的所有边图形节点集合
        /// \see IGraphicsBRepEdge
        virtual std::vector<const IGraphicsBRepEdge*> GetEdges() const = 0;

        /// \brief 根据UV值得到面上点
        /// \param dU U值
        /// \param dV V值
        /// \return 面上点
        virtual Vector3d GetPoint(double dU, double dV) const = 0;

        /// \brief 获取面的U向范围
        /// \return 面的U向范围
        virtual Intervald GetSurfaceRangeU() const = 0;

        /// \brief 获取面的V向范围
        /// \return 面的V向范围
        virtual Intervald GetSurfaceRangeV() const = 0;

        /// \brief 获取几何面
        /// \return 几何面
        virtual const IFace* GetGmFace() const = 0;

        /// \brief 获取几何面
        /// \return 几何面
        virtual IFace* GetGmFaceFW() = 0;

        /// \brief 获取面所属的体图形节点
        /// \return 面所属的体图形节点
        virtual const IGraphicsBRepBody* GetBRepBody() const = 0;
 
        /// \brief 设置几何面
        /// \param pFace 几何面
        /// \return 无
        virtual void SetFace(const IFace* pFace) = 0;

        /// \brief 克隆面图形节点
        ///
        /// 其中的几何面替换成目标体中相应位置的目标几何面
        /// \param pGBody 目标体
        /// \param pFace 目标几何面
        /// \return 克隆出来的图形节点
        virtual OwnerPtr<IGraphicsNode> Clone(const IGraphicsBRepBody* pGBody, const IFace* pFace) const = 0;

        /// \brief 获取面的所有边图形节点
        /// \return 面的所有边图形节点
        /// \see IGraphicsBRepEdge
        virtual std::vector<IGraphicsBRepEdge*> GetEdgesFW() = 0;

        /// \brief 获取面上环的数目
        /// \return 面上环的数目
        virtual int GetPolyCurveCount()const = 0;

        /// \brief 获取指定环的边集合
        /// \param loopIndex 环的序号
        /// \param brepEdges BRep边集合
        /// \param edgeSameDirections 与BRep边集合对应。即对应的每条边与面上的对应参数线是否同向
        /// \return 无
        virtual void GetEdges(int loopIndex,std::vector<const IGraphicsBRepEdge*>& brepEdges,std::vector<bool>& edgeSameDirections) const = 0;

        /// \brief 判断是否是壳上的面
        /// \return true-是；false-不是
        virtual bool IsShellFace() const = 0;

        /// \brief 判断是否是背面显示
        /// \return true-是；false-不是
        virtual bool IsBackFaceVisible()const = 0;

        /// \brief 设置是否是背面显示
        /// \param visible 是否是背面显示
        /// \return 无    
        virtual void SetIsBackFaceVisible(bool isVisible) = 0;

        /// \brief 判断是否是对纹理进行归一化处理
        /// \return true-是；false-不是
        virtual bool IsTextureCoordinateNormalized()const = 0;

        /// \brief 设置是否是对纹理进行归一化处理
        /// \param isNormalized 是否是对纹理进行归一化处理
        /// \return 无    
        virtual void SetIsTextureCoordinateNormalized(bool isNormalized) = 0;

        /// \brief 获取调试信息
        /// \return 调试信息
        virtual std::wstring GetStringForDebug()const = 0;

    public:
        /// \brief 根据几何面以及它所属的BRep体图形节点来创建BRep体的面图形节点
        /// \param pBody BRep体图形节点
        /// \param pFace 几何面
        /// \return 创建的BRep体的面图形节点
        static OwnerPtr<IGraphicsBRepFace> Create(const IGraphicsBRepBody* pBody, const IFace* pFace);
    };
}








